package cn.xdf.learn.leetcode.滑动窗口;

import java.util.HashMap;
import java.util.Map;

public class 无重复字符的最长子串 {

    /**
     * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
     *
     * 示例 1:
     *
     * 输入: s = "abcabcbb"
     * 输出: 3
     * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
     * 示例 2:
     *
     * 输入: s = "bbbbb"
     * 输出: 1
     * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
     * 示例 3:
     *
     * 输入: s = "pwwkew"
     * 输出: 3
     * 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
     *      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
     * 提示：
     *
     * 0 <= s.length <= 5 * 104
     * s 由英文字母、数字、符号和空格组成
     * Related Topics
     * 哈希表
     * 字符串
     * 滑动窗口
     * @param s
     * @return
     */
    public int lengthOfLongestSubstring(String s) {


        if (s.length() == 1) {
            return 1;
        }

        int max = 0;
        int len = s.length();
        Map<Character, Integer> map = new HashMap<>();

        for (int i = 0; i < len; i++) {
            for (int j = i; j < len; j++) {

                int num = map.getOrDefault(s.charAt(j), 0);
                map.put(s.charAt(j), num + 1);
                if (num == 1) {
                    //存在重复子串
                    break;
                }else {
                    if (max < j - i + 1){
                        max = j - i + 1;
                    }
                }
            }

            map.clear();
        }

        return max;

    }

    public static void main(String[] args) {
        无重复字符的最长子串 solution = new 无重复字符的最长子串();
        int i = solution.lengthOfLongestSubstring("abcabcbb");
        System.out.println(i);
    }
}
